package buscawiki;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Universidad Simón Bolívar
 * Sede Sartenejas
 * Departamento de Computación y Tecnologías de la Información
 * Traductores e Interpretadores (CI-3725)
 * Trimestre Sep-Dic 2009
 *
 * Proyecto 1: Busqueda Simple
 *
 * @author Jofran Peña Durán
 * @author Richard Simoes Ferreira 03-36514
 */
public class Simple {
    
    private static File archivo;
    private static BufferedReader lector;
    private Pattern expReg;
    public LinkedList<String> lista;
/**
 * Crea una nueva instancia de una busqueda simple.
 * <p>
 * Recibe una expresión regular aceptada por la librería Regex de Java junto
 * con la dirección absoluta del fragmento de wikipedia sobre el cuál
 *  se va a ejecutar la busqueda.
 * @param expReg una expresión regular aceptada por la librería Regex de Java
 * @param path dirección absoluta del fragmento de wikipedia donde se
 * va a realizar la búsqueda
 * @throws IOException si hay algun problema relacionado con el documento.
 */
    public Simple(String expR, String path) throws Exception{
        String expRegular = "<title>"+expR+"</title>";
        expReg = Pattern.compile(expRegular);
        lista = new LinkedList<String>();
        archivo = new File(path);
        lector = new BufferedReader(new FileReader(archivo));
    }
/**
 * Lee el extracto de wikipedia buscando buscando el patrón de la ExpReg
 * sobre los títulos de los artículos
 */
    public void leerSimple() {
        try {
            Iterator iterator;
            String linea;
            while(lector.ready()){
                linea = lector.readLine();
                buscarSimple(linea);
            }
            Collections.sort(lista);
            iterator = lista.iterator();     
            while (iterator.hasNext()){
                System.out.print(iterator.next()+"\n");  
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            try{
                lector.close();
            }catch(IOException e1){}
        }
    }
/**
 * Realiza una busqueda del patrón de la ExpReg sobre la línea, si encuentra
 * el patrón agrega ese título a la lista, sino lo ignora.
 * @param linea Línea leída del documento,
 */
    public void buscarSimple(String linea) {
        Matcher palabra = expReg.matcher(linea);
        while (palabra.find()) {
            String remover = "</?title>";
            String reemplazo = "";
            Pattern p = Pattern.compile(remover);
            Matcher m = p.matcher(linea);
            linea = m.replaceAll(reemplazo);
            lista.addFirst(linea);
        }
    }    
}
